package com.gskj.gulimall.seckill;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

/***
 *  1. 整合Sentinel
 *   引入依赖：spring-cloud-starter-alibaba-sentinel
 *   下载Sentinel控制器，
 *   配置Sentinel控制器地址
 *   在控制台调整参数，【默认所有流控设置保存在当前项目内存中，项目重启失效】
 *
 *   ----------------------------------------------------------------
 *  2. 每一个微服务都导入actuator
 *           <dependency>
 *             <groupId>org.springframework.boot</groupId>
 *             <artifactId>spring-boot-starter-actuator</artifactId>
 *         </dependency>
 *    配置文件，web暴漏路径
 *    开启actuator web暴露路径
 *    management.endpoints.web.exposure.include=*
 *    自定义Sentinel流控返回数据(即请求路径被限流以后的返回数据)
 *
 *   ----------------------------------------------------------------
 *  3. 使用Sentinel来保护feign远程调用异常
 *    1. 调用方法的熔断保护 ：feign.sentinel.enabled=true
 *    2. 在sentinel仪表盘手动指定降级策略； 当远程服务被降级处理。就会默认触发自定义的熔断回调方法
 *    3. 在超大流量访问时，必须牺牲一些远程服务，在服务提供方(远程服务)指定降级策略。
 *     提供方服务在运行，但是不运行自己的业务逻辑，返回的是默认的降级数据(限流数据)。
 *  ----------------------------------------------------------------
 *
 *  4. 自定义受保护的资源
 *   1. 代码方式： try (Entry entry = SphU.entry("getCurrentSeckillSkus")) { TODO.. } catch(BloackException e)
 *   2. 注解方式:     @SentinelResource(value = "getCurrentSeckillSkus", blockHandler = "blockHandler")
 *   1，2都要配置被限流后的默认返回数据
 *   url请求可以设置统一返回：WebCallbackManager
 *
 */
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class GulimallSeckillApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallSeckillApplication.class, args);
    }

}
